AWS CDKでEC2のキーペアを作成してみた
先日、EC2のキーペアに新しい管理機能が追加されて、CloudFormationでキーペアが作成できるようになりました。
CloudFormationでキーペアが作成できるようになったんだから、そのうちcdkでもキーペアが作成できるようになるだろうと待っていました。 v2.25.0 でできるようになったので試してみました。
前提条件
AWS CDKはv2.25.0以上を使用します。
$ cdk --version 2.25.0 (build ae1cb4b)
構成図
ざっくりこんな感じの環境を作ります。
AWS CDKのサンプルプログラム
TypeScriptのサンプルプログラムは次のとおりです。
#!/usr/bin/env node import "source-map-support/register" import {Construct} from 'constructs' import {App, CfnOutput, RemovalPolicy, Stack, StackProps, Token} from 'aws-cdk-lib' import * as ec2 from 'aws-cdk-lib/aws-ec2' class TestStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // VPC作成 const vpc = new ec2.Vpc(this, 'VPC', { maxAzs: 2, natGateways: 0, subnetConfiguration: [{ name: 'PublicSubnet', subnetType: ec2.SubnetType.PUBLIC, }], }) // キーペア作成 const cfnKeyPair = new ec2.CfnKeyPair(this, 'CfnKeyPair', { keyName: 'test-key-pair', }) cfnKeyPair.applyRemovalPolicy(RemovalPolicy.DESTROY) // キーペア取得コマンドアウトプット new CfnOutput(this, 'GetSSHKeyCommand', { value: `aws ssm get-parameter --name /ec2/keypair/${cfnKeyPair.getAtt('KeyPairId')} --region ${this.region} --with-decryption --query Parameter.Value --output text`, }) // EC2作成 const instance = new ec2.Instance(this, 'Instance', { vpc, instanceType: ec2.InstanceType.of( ec2.InstanceClass.T3, ec2.InstanceSize.NANO, ), machineImage: new ec2.AmazonLinuxImage({ generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2, }), keyName: Token.asString(cfnKeyPair.ref), }) instance.connections.allowFromAnyIpv4(ec2.Port.tcp(22)) } } const app = new App() new TestStack(app, 'TestStack',)
CDKでEC2のキーペアを作成する
上記の cdk.ts を次のコマンドを実行してデプロイすると、EC2とキーペアが構築できます。
$ cdk deploy TestStack
キーペアの秘密鍵はSystems Managerのパラメータストアに保存されています。
秘密鍵はAWS CLIで取得することもできます。 取得するためのコマンドを TestStack のOutputに出力するようにしているので、これを実行して出力結果を保存すれば秘密鍵になります。
この出力結果を適当なファイル(例:cdk-key-pair-sample)に保存して、次のようにパーミッション設定をすればSSH接続できます。
$ chmod 600 cdk-key-pair-sample $ ssh -i cdk-key-pair-sample ec2-user@<<EC2のパブリックIP>>